//1. 在let和const之间，建议优先使用const，尤其是在全局环境，不应该设置变量，只应设置常量。这符合函数式编程思想，有利于将来的分布式运算。
//所有的函数都应该设置为常量。
// bad
var x = 'a', y = 2, z = 3; //先用var声明，再const，一样是重复声明

// good
//const a = 1;
//const b = 2;
//const c = 3;

// best
const [a, b, c] = ['a', 2, 3];


//2.静态字符串一律使用单引号或反引号，不使用双引号。动态字符串使用反引号。
// bad
const d = "foobar";
const e = 'foo' + a + 'bar';

// good
const f = 'foobar';
const g = `foo${a}bar`;
console.log('动态字符串: ' + g);

//3.解构赋值
//3.1使用数组成员对变量赋值时，优先使用解构赋值。
const arr = [1, 2, 3, 4];

// bad
//const first = arr[0];
//const second = arr[1];

// good
const [first, second] = arr;

//3.2函数入参
//bad
function getFullName(user) {
  const firstName = user.firstName;
  const lastName = user.lastName;
}

//best
function getFullName({ firstName, lastName }) {
}

//3.3函数返回值
// bad
function processInput(input) {
  let left, right, top, bottom;
  return [left, right, top, bottom];
}

// good
function processInput(input) {
  let left, right, top, bottom;
  return { left, right, top, bottom };
}
//获取返回值
const { left, right } = processInput('input');

//4.对象
//4.1单行定义的对象，最后一个成员不以逗号结尾。多行定义的对象，最后一个成员以逗号结尾。
// good
const obj1 = { k1: 'v1', k2: 'v2' };
const obj2 = {
  k1: 'v1',
  k2: 'v2',
};


//4.2如果对象的属性名是动态的，可以在创造对象的时候，使用属性表达式定义。
// good
const getName = () => 'dynamic';

const obj3 = {
  id: 5,
  name: 'San Francisco',
  [getName()]: true,
};
//编译后的代码
//``````
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var getName = function getName() {
  return 'dynamic';
};
// good
var obj3 = _defineProperty({
  id: 5,
  name: 'San Francisco'
}, getName(), true);
//``````

//5.数组
//5.1使用扩展运算符（...）拷贝数组。
// good
const itemsCopy = [...items];

//使用Array.from方法，将类似数组的对象转为数组。
const foo = document.querySelectorAll('.foo'),
	nodes = Array.from(foo);


//6.函数
//6.1 立即执行函数可以写成箭头函数的形式。
(() => {
  console.log('Welcome to the Internet.');
})();

//6.2 那些需要使用函数表达式的场合，尽量用箭头函数代替。因为这样更简洁，而且绑定了this。
// bad
[1, 2, 3].map(function (x) {
  return x * x;
});

// good
[1, 2, 3].map((x) => {
  return x * x;
});


// best
[1, 2, 3].map(x => x * x); //因为只用一行就显示了
//简单的、单行的、不会复用的函数，建议采用箭头函数。如果函数体较为复杂，行数较多，还是应该采用传统的函数写法。

//6.3 使用默认值语法设置函数参数的默认值。
// bad
function handleThings(opts) {
  opts = opts || {};
}

// good
function handleThings(opts = {}) {
  // ...
}

//6.4 所有配置项都应该集中在一个对象，放在最后一个参数，布尔值不可以直接作为参数。
// bad
function divide(a, b, option = false ) {
}

// good
function divide(a, b, { option = false } = {}) {
}

//7.模块
//如果模块默认输出一个对象，对象名的首字母应该大写。
const StyleGuide = {
  es6: {
  }
};

export default StyleGuide;
//约定吧，class 名字是大写的。
